<?php
/**
 * ZAuth v1.0
 * leaboy.w <leaboy.w@gmail.com>
 * http://www.gnu.org/licenses/gpl.html     GPL 3
 */


function ZAuth($string, $key, $isEncrypt = true, $expiry = 0) {
	if(empty($key)){
		return false;
	}

	// 变化生成的密文
	$dynkey = $isEncrypt ? md5(microtime()) : substr($string, 6, 16) . substr($string, -16);
	$dynkey_l = substr($dynkey, 0, 16);
	$dynkey_r = substr($dynkey, 16);
	// 校验密文是否被篡改
	$dynkey_pre = substr(md5(substr($dynkey, 0, 6)), -6);

	// 密匙
	$fixedkey = md5($key);
	$fixedkey_l = substr($fixedkey, 0, 16);
	$fixedkey_r = substr($fixedkey, 16);

	// 参与运算的密匙
	$cryptkey = md5($dynkey_l . $fixedkey_l . $dynkey_r . $fixedkey_r);

	$string = $isEncrypt ? sprintf('%010d', $expiry ? $expiry + time() : 0) . $fixedkey_l . $dynkey_pre . $string . $dynkey_r : base64_decode(substr($string, 22, -16));

	$result = '';
	$len = strlen($string);
	for ($n = 0; $n < $len; $n++) {
		$result .= chr(ord($string{$n}) ^ ord($cryptkey{$n % 32}));
	}
	return $isEncrypt ? $dynkey_pre . $dynkey_l . str_replace('=', '', base64_encode($result)) . $dynkey_r : (((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && $dynkey_pre == substr($result, 26, 6)) ? substr($result, 32, -16) : false);
}